package com.ql.design.proxy.dynamic;

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Proxy;

import com.ql.design.proxy.demo1.Sourcable;
import com.ql.design.proxy.demo1.Source;
/**
 * 目前Java开发包中包含了对动态代理的支持，但是其实现只支持对接口的的实现。 
 * 其实现主要通过java.lang.reflect.Proxy类和java.lang.reflect.InvocationHandler接口。 
 * Proxy类主要用来获取动态代理对象，InvocationHandler接口用来约束调用者实现
 *
 */
public class DynamicClient {
	/**
	 *告诉 DynamicProxy类用一个指定的类加载器来动态创建一个对象，
	 * 并提供InvocationHanler来代替方法主题。
	 * 
	 * 动态代理的限制
              JDK的动态代理并不能随心所欲的代理所有的类。Proxy.newProxyInstance方法的第二个参数只能是接口数组， 
              	也就是Proxy只能代理接口。
	 */
	public static void main(String[] args) {
		//创建原始对象
		Sourcable source =  new Source();
		// 创建代理实例
		InvocationHandler handler = new DynamicProxy(source);
		
		//取得代理对象
		Sourcable proxy =(Sourcable)Proxy.newProxyInstance(source.getClass().getClassLoader()
				,source.getClass().getInterfaces(),handler);
		// 动态代理对象掉用 operation
		proxy.operatin();
		
		
	}
	
	
	
	
}
